package br.com.paradigmas.modulos.consultas.artista;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

import br.com.paradigmas.modulos.cadastros.artista.CadastroArtista;
import br.com.paradigmas.modulos.repositorio.repositorio.Repositorio;
import br.com.paradigmas.persistencia.om.Artista;
import br.com.paradigmas.persistencia.om.Musica;

public class ConsultaArtista 
{
	/**
	 * Obtem uma lista de Artista a partir do 'Artistas.txt'
	 * 
	 * @param artista
	 * @author Djalma
	 * @return _artista
	 */
	public Artista getArtista(String artista)
	{
		try
		{
			ArrayList<Artista> artistas = new CadastroArtista().setArtista(this.getFileArtista(), artista);
			
			if(artistas.size() == 1)		{ return artistas.get(0); }
			else if(artistas.size() > 1)	{ return this.selectArtista(artistas); }
			else							{ return new Artista(0, artista, null, null, 0); }
		}
		catch (Exception e)
		{ e.printStackTrace(); }
		
		return null;
	}
	
	/**
	 * Obtem uma lista de Artista a partir do repositorio
	 * 
	 * @param repositorio
	 * @param artista
	 * @author Djalma
	 * @return _artista
	 */
	public Artista getArtista(Repositorio repositorio, String artista)
	{
		try
		{
			ArrayList<Artista> artistas = new ArrayList<Artista>();
			
			for (Artista artista2 : repositorio.getArtistas()) 
			{
				if(artista2.getNome().toLowerCase().contains(artista.toLowerCase()))
				{ artistas.add(artista2); }
			}
			
			if(artistas.size() == 1)		{ return artistas.get(0); }
			else if(artistas.size() > 1)	{ return this.selectArtista(artistas); }
		}
		catch (Exception e)
		{ e.printStackTrace(); }
		
		return null;
	}
	
	/**
	 * Captura a lista de Artistas
	 * 
	 * @author Djalma
	 * @return artistas || null (em caso de erro)
	 */
	public ArrayList<Artista> getArtistas()
	{
		try
		{
			return new CadastroArtista().setArtista(this.getFileArtista(), "");
		}
		catch (Exception e)
		{ e.printStackTrace(); }
		
		return null;
	}
	
	/**
	 * Seleciona o Artista desejado
	 * 
	 * @author Djalma
	 * @param artistaLista
	 * @return _artista
	 */
	private Artista selectArtista(ArrayList<Artista> artistaLista)
	{
		// Variaveis
		Scanner scanner = new Scanner(System.in);
		String artistaSelecionado;
		
		System.out.println("Resultado da Busca:");
		
		// Demonstra os artistas encontrados ao usuario
		for (Artista artista : artistaLista)
		{
			System.out.println(artista.getNome() + "(" + artista.getPkArtista() + ")");
		}
		
		// Captura a pkArtista desejada
		System.out.println("\nDigite o valor entre '()' para selecionar o artista desejado:");
		artistaSelecionado = scanner.next();
		
		// Retorna o artista desejado
		for (Artista artista : artistaLista)
		{
			if(artista.getPkArtista() == Long.parseLong(artistaSelecionado))
			{
				return artista;
			}
		}
		
		return null;
	}
	
	
	/**
	 * Recupera o arquivo 'Artistas.txt' e transforma numa String seu conteudo
	 * 
	 * @author Djalma
	 * @return stringBuffer
	 */
	private String getFileArtista()
	{
		try 
		{
			StringBuffer stringBuffer = new StringBuffer();
			BufferedReader bufferedReader = null;
			String artista;
			File file = null;
			
			// Captura o arquivo '.txt' com os artistas 
			file = new File(getClass().getResource("Artistas.txt").toURI());
			
			// Leitura do arquivo
			bufferedReader = new BufferedReader(new FileReader(file));
			
			// Atribui ao stringBuffer as linhas lidas do arquivo
			while((artista = bufferedReader.readLine()) != null)
			{
				stringBuffer.append(artista + " ");
			}
			
			return stringBuffer.toString();
		} 
		catch (URISyntaxException e) 	{ e.printStackTrace(); }
		catch (FileNotFoundException e) { e.printStackTrace(); }
		catch (IOException e) 			{ e.printStackTrace(); }
		catch (Exception e)				{ e.printStackTrace(); }
		
		return null;
	}
}
